package com.itheima.Util;

import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import java.util.Date;

/**
 * jwt令牌生成与解析
 */
public class JwtUtil {
    /**
     * 数字签名(key)
     */
    private static final String SIG = "992b0c3a-ec6b-4445-8232-9e4c9beb06bc";

    private JwtUtil() {
    }

    /**
     * 生成token
     *
     * @param username 用户名
     * @param password 密码
     * @param min      过期时间,以分钟为单位
     * @return token字符串
     */
    public static String generateToken(String username, String password, long min) {
        // 1.构建jwt对象
        // 2.指定header(一般不指定)
        // 3.放置payload以及过期时间和生效时间
        // 4.进行数字签名, 第一个参数是数字签名,需要自己生成, 第二个参数是加密算法,
        // 5.生成token
        Date now = new Date();
        String token = Jwts.builder()
                .claim("username", username)
                .claim("password", password)
                .issuedAt(now)
                .expiration(new Date(now.getTime() + 60 * 1000 * min))
                .signWith(Keys.hmacShaKeyFor(SIG.getBytes()), Jwts.SIG.HS256)
                .compact();
        return token;
    }

    /**
     * 验证 token
     *
     * @param token 生成的token令牌
     * @return payload中的用户信息, 用FastJson存储
     * 若解析失败,会抛出异常,调用时需处理
     */
    public static JSONObject checkToken(String token) {
        // 1.构建解析对象
        // 2.指定数字签名
        // 3.指定被签名后的token
        JwtParser parser = Jwts.parser()
                .verifyWith(Keys.hmacShaKeyFor(SIG.getBytes()))
                .build();
        //获取token的载体对象
        Claims payload = parser.parseSignedClaims(token).getPayload();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username", payload.get("username"));
        jsonObject.put("password", payload.get("password"));
        return jsonObject;
    }


}
